package com.leyou.page.service;

import com.leyou.common.exception.pojo.ExceptionEnum;
import com.leyou.common.exception.pojo.LyException;
import com.leyou.item.client.ItemClient;
import com.leyou.item.dto.SpecGroupDTO;
import com.leyou.item.dto.SpuDTO;
import com.leyou.item.entity.Brand;
import com.leyou.item.entity.Category;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
public class PageService {

    @Autowired
    private ItemClient itemClient;

    @Autowired
    private TemplateEngine templateEngine;

    @Value("${ly.static.itemDir}")
    private String itemDir;

    @Value("${ly.static.itemTemplate}")
    private String itemTemplate;

    /**
     * 加载商品详情页面所需要的数据
     * @param id
     * @return
     */
    public Map<String, Object> loadItemData(Long id) {
        //第二步：根据spuId查询SpuDTO对象
        SpuDTO spuDTO = itemClient.findSpuDTObySpuId(id);
        //第三步：根据三个分类id的集合查询三个分类对象的集合
        List<Category> categories = itemClient.findCategoriesByIds(spuDTO.getCategoryIds());
        //第四步：根据品牌id查询品牌对象
        Brand brand = itemClient.findBrandById(spuDTO.getBrandId());
        //第五步：根据第三级分类id查询规格组及其组内规格参数
        List<SpecGroupDTO> specGroupDTOS = itemClient.findSpecGroupDTOByCid(spuDTO.getCid3());
        //第一步：创建一个返回值对象
        Map<String, Object> itemDataMap = new HashMap<>();
        itemDataMap.put("categories", categories);
        itemDataMap.put("brand", brand);
        itemDataMap.put("spuName", spuDTO.getName());
        itemDataMap.put("subTitle", spuDTO.getSubTitle());
        itemDataMap.put("detail", spuDTO.getSpuDetail());
        itemDataMap.put("skus", spuDTO.getSkus());
        itemDataMap.put("specs", specGroupDTOS);
        return itemDataMap;
    }

    /**
     * 创建静态页面
     */
    public void buildStaticPage(Long spuId){
        //获取上下文
        Map<String, Object> itemData = loadItemData(spuId);
        Context context = new Context();
        context.setVariables(itemData);
        //提供输出静态化页面的文件夹对象
        File targetFile = new File(itemDir);
        //提供静态化页面的名称
        String pageName = spuId+".html";
        //提供最终静态页输出的文件对象
        File pageFile = new File(targetFile, pageName);
        //凡是流，用完都要关闭，否则改流会一直占用响应的资源
        try (PrintWriter write = new PrintWriter(pageFile)) {
            //创建静态页
            templateEngine.process(itemTemplate, context, write);
        }catch (Exception e){
            throw new LyException(ExceptionEnum.FILE_WRITER_ERROR);
        }

    }

    public void delStaticPage(Long id) {
        //通过spuId得到静态页文件对象
        //提供输出静态化页面的文件夹对象
        File targetFile = new File(itemDir);
        //提供静态化页面的名称
        String pageName = id+".html";
        //提供最终静态页输出的文件对象
        File pageFile = new File(targetFile, pageName);
        //如果存储此文件则删除
        if(pageFile.exists()){
            pageFile.delete();
        }
    }
}
